package com.season.seasonStudy.javase.j_003_array_collection;

import com.season.seasonStudy.javase.entity.Users;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/**
 * User u =  new User();
 * list 是可以的
 * 但是 set是不可以的
 * 是否需要new 第二次   是否分配空间
 * 找到了,拿出来,传递地址,直接可以改
 * 
 * 按照下标插入,必须小于size()
 *
 */
public class UserTest {
	public static void main(String[] args) {
		//Object equals比较的是地址,String重写了,所以比较的是内容,我们自己也可以重写equals
		Users user =new Users(0, "jijie", 24);
		Collection coll = new ArrayList();
		coll.add(user);
		coll.add(new Users(1, "aha", 18));
		coll.add(new Users(2, "aha", 19));
		coll.add(new Users(3, "aha", 30));
		coll.add(new Users(3, "aha", 30));
		coll.add(user);//不可以按照下标进行添加
		
		
		System.out.println("........................");
		for (Object object : coll) {
			System.out.println((Users)object);
		}//collection 无序 不唯一
		
		
		for (int i = 0; i < coll.size(); i++) {
			System.out.println(coll.toArray()[i]);
		}
		System.out.println("........................");
		
		//coll.toArray();
		//所以可以使用foreach

		System.out.println("----------------------------");
		LinkedList ll = new LinkedList();
		ll.add(new Users(1, "aha", 18));
		ll.add(new Users(2, "aha", 19));
		ll.add(new Users(3, "aha", 30));
		ll.add(new Users(3, "aha", 30));
		for (int i = 0; i < ll.size(); i++) {
			Users us =(Users)ll.getFirst();
			Users aaa =(Users)ll.removeFirst();//这么着不会删除干净的,因为size会变的
			//仅仅遍历,用get就可以了,但是推荐迭代器
			System.out.println("first:"+us);
			Users aa =(Users)ll.get(i);
			System.out.println("遍历的:"+aa);
		}
		ll.removeFirst();
		ll.removeLast();
		
		/**
		 * 若不用泛型,那就 A ---Object----A
		 * 遍历方式
		 * 1,数组 下标	>>>>for循环
		 * 			>>>>toArray
		 * 2,while(!ll.isEmpty){
		 * }
		 * 3,迭代器  iterator把所有东西放到这一个工具里面,然后再摇出来,并不会改变原先
		 * 	collection好用都好用
		 * 4,foreach增强型for循环	好处简洁,缺点无下标
		 */

		
		/**
		 * 先得到一个迭代器
		 * 然后while遍历
		 */
		Iterator it = coll.iterator();//内部类实现的
		while (it.hasNext()) {
			Users uss= (Users)it.next();
			System.out.println(uss);		
		}
		
		/**
		 * set集合有点难
		 */
		HashSet set = new HashSet();
		set.add(new Users(1, "aha", 18));
		set.add(new Users(2, "aha", 19));
		set.add(new Users(3, "aha", 30));
		set.add(new Users(3, "aha", 30));
		System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
		for (Object object : set) {
			System.out.println((Users)object);
		}
		System.out.println(set.size());
		/**
		 * 重写了equals方法了也体现不出唯一,是因为还需比较hashcode
		 * native hashcode使用了其他语言写的的方法 native本地了   JNI,感兴趣就去看看
		 * 
		 * 又想按照id  又想id name判断,那就插借口吧
		 * 
		 */
		set.add("aaaaa");
		set.add("aaaaa");
		set.add("aaaaa");
		set.add("aaaaa");
		System.out.println(set.size());
		/**
		 * 重写users的hashcode
		 */
		
		/**
		 * Map
		 * 区别
		 * 	添加,key value	key一般字符串,数字,但是可以放任何
		 * 	只要键不重复,值没意见
		 */
		System.out.println(">>>>>>>>>>>>MAP>>>>>>>>>>>>>>>>>>>");
		Map map = new HashMap();
		map.put(0, new Users(1, "aha", 18));
		map.put(1, new Users(2, "aha", 18));
		map.put(null, new Users(2, "aha", 18));
		map.put(1, new Users(2, "aha", 18));
		map.put("22", new Users(4, "aha", 18));
		System.out.println(map.size());
		/**
		 * map没下标不能随机访问,只能迭代器
		 * 也涉及到了hashcode
		 */
		map.containsKey(1);
		//map.remove(key); 根据键删除
		System.out.println(map.containsKey(1));
		//遍历	key集合	value集合
		Set keys= map.keySet();//循环遍历 ....
		Collection values = map.values();
		Set kv = map.entrySet();//实体集合
		for (Object en : kv) {
			Entry entry = (Entry)en;
			entry.getKey();
			entry.getValue();
			System.out.println("entry>>>>"+entry);//中间使用"="
			System.out.println("key:"+entry.getKey()+"    value:"+entry.getValue());
			System.out.println("------------------------------");
		}
		
		System.out.println("MAP2-----------------");
		Iterator aa = map.values().iterator();
		while (aa.hasNext()) {
			System.out.println(aa.next());
		}
		
	}
	
}
